package ec.edu.ucacue.siop.proceso.cargaDiaria;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import org.hibernate.Session;

import ec.edu.ucacue.siop.dao.historico.HistoriaVariablesAlimentacionDAO;
import ec.edu.ucacue.siop.dao.historico.HistoriaVariablesAlimentacionDAOImpl;
import ec.edu.ucacue.siop.dao.historico.HistoriaVariablesProcesoDAO;
import ec.edu.ucacue.siop.dao.historico.HistoriaVariablesProcesoDAOImpl;
import ec.edu.ucacue.siop.dao.recurso.VariableAlimentacionDAO;
import ec.edu.ucacue.siop.dao.recurso.VariableAlimentacionDAOImpl;
import ec.edu.ucacue.siop.dao.recurso.VariableProcesoDAO;
import ec.edu.ucacue.siop.dao.recurso.VariableProcesoDAOImpl;
import ec.edu.ucacue.siop.modelo.operacion.historico.HistoriaVariablesAlimentacion;
import ec.edu.ucacue.siop.modelo.operacion.historico.HistoriaVariablesProceso;
import ec.edu.ucacue.siop.modelo.recurso.VariableAlimentacion;
import ec.edu.ucacue.siop.modelo.recurso.VariableProceso;
import ec.edu.ucacue.siop.proceso.calculoBorrar.Cont24horas;
import ec.edu.ucacue.siop.proceso.iniciar.lectores.ContenedorRelacion;
import ec.edu.ucacue.siop.proceso.iniciar.lectores.LectorExcelCrudCem;
import ec.edu.ucacue.siop.proceso.iniciar.lectores.LectorTablaRelacionVar;
import ec.edu.ucacue.siop.utilidades.HibernateUtil;

public class CargadorDiarioCemento {
	private String error;

	public String getError() {
		return error;
	}

	public void setError(String error) {
		this.error = error;
	}
	
	public boolean cargar(String directorio, String fecha) {
		String hojaExcel = "Reporte M. Cemento";
		File dirRaiz = new File(directorio); 
		if(!dirRaiz.isDirectory()){
			error = "La ruta indicada "+ directorio + " no existe";
			return false;
		}
		if(dirRaiz.list().length == 0){
			error =" El directorio "+ directorio + " esta vacio";
			return false;
		}
		String[] listaDir = dirRaiz.list();
		
		ordenar(listaDir);
		for(int i =0; i<5;i++){
			System.out.println("archivo " + listaDir[i]);
		}
		if(!listaDir[0].contentEquals("0tablaRelacion.xls")) {
			error = "El archivo de relacion no esta en el directorio";
			return false;
		}
		LectorTablaRelacionVar lectorTabRel = new LectorTablaRelacionVar();
		if(!lectorTabRel.leer(dirRaiz+"/0tablaRelacion.xls")){
			error = "En directorio " + directorio + " " +lectorTabRel.getError();
			return false;
		}
		
		List< ContenedorRelacion> listaRelaciones = lectorTabRel.getListaRelaciones();
		Session ses = HibernateUtil.beginTransaction();
		HistoriaVariablesProcesoDAO hisDAOPr = new HistoriaVariablesProcesoDAOImpl();
		HistoriaVariablesAlimentacionDAO hisDAOAl = new HistoriaVariablesAlimentacionDAOImpl();
		List<VariableAlimentacion> listaVarAlim = new ArrayList<VariableAlimentacion>();
		VariableAlimentacionDAO varAlDao = new VariableAlimentacionDAOImpl();
		List<VariableProceso> listaVarPro = new ArrayList<VariableProceso>();
		VariableProcesoDAO varProDAO = new VariableProcesoDAOImpl();
		for(int i=0; i<listaRelaciones.size(); i++){
			if(listaRelaciones.get(i).getTipoVar()==0) {
				if(listaRelaciones.get(i).getIdVar()!=0) {
					VariableAlimentacion varAl = varAlDao.findByID(VariableAlimentacion.class, listaRelaciones.get(i).getIdVar());
					listaVarAlim.add(varAl);
				}
			}
			else {
				VariableProceso varPro = varProDAO.findByID(VariableProceso.class, listaRelaciones.get(i).getIdVar());
				listaVarPro.add(varPro);
			}
		}
		String nomArchivo = "CEMENTO "+fecha+".xls";
		
		LectorExcelCrudCem lector = new LectorExcelCrudCem();
		if(!lector.leer(directorio+"/"+nomArchivo, hojaExcel, "2015", lectorTabRel.getFilInicio(), lectorTabRel.getFilFinal())){
			error = "En archivo " + nomArchivo +" " +lector.getError();
			return false;
		}
		List<Cont24horas> listaValores = lector.getListaVarDiaria();
		int indAl=0;
		int indPr=0;
		for(int i=0; i<listaValores.size(); i++){
			if(listaRelaciones.get(i).getTipoVar()==0 ) {
				if(listaRelaciones.get(i).getIdVar() != 0) {
					for(int j=0; j<listaValores.get(i).getContenido().size();j++){
						if(listaRelaciones.get(i).getIdVar() != 0){
							HistoriaVariablesAlimentacion hisAl = hisDAOAl.create(listaVarAlim.get(indAl), 
									listaValores.get(i).getContenido().get(j).getValor(), 
									listaValores.get(i).getContenido().get(j).getFecha());
							ses.saveOrUpdate(hisAl);
						}
					}
					indAl++;
				}					
			}
			else {
				for(int j=0; j<listaValores.get(i).getContenido().size();j++){
					HistoriaVariablesProceso hisPro = hisDAOPr.create(listaVarPro.get(indPr), 
							listaValores.get(i).getContenido().get(j).getValor(), 
							listaValores.get(i).getContenido().get(j).getFecha());
					ses.saveOrUpdate(hisPro);
				}
				indPr++;
				
			}
		}
		
		
		HibernateUtil.commitTransaction();
		HibernateUtil.closeSession();
		return true;

	}
	
	private void ordenar(String[] listadoArchivos) {
		for(int i=0; i<listadoArchivos.length-1;i++) {
			
			for(int j=i+1; j<listadoArchivos.length; j++) {
				if(listadoArchivos[i].compareTo(listadoArchivos[j]) > 0) {
					String aux = listadoArchivos[i];
					listadoArchivos[i] = listadoArchivos[j];
					listadoArchivos[j] = aux;
				}
			}
		}
	}
}
